#leetcode题目65：有效数字
#难度：困难
#时间复杂度：O(n)
#空间复杂度：O(1)
#方法：状态机
"""
状态机（Finite State Machine, FSM）是一种用于描述系统状态随输入变化而转移的模型。它由一组状态、输入、状态转移规则和（可选的）输出组成。状态机常用于解析字符串、协议设计、控制流程等场景。

在本题“有效数字”中，状态机可以用来逐字符判断字符串是否符合数字的格式规范。每读取一个字符，根据当前状态和字符类型，转移到下一个状态，最终判断是否停留在合法的终止状态。

常见的状态机实现方式有：
1. 用字典或二维数组表示状态转移表。
2. 用变量记录当前状态，遍历输入，根据转移表更新状态。
3. 最后判断当前状态是否为接受状态。

例如，解析有效数字时，状态机会区分空格、正负号、数字、小数点、指数符号等不同输入，并根据规则转移状态。
"""

class Solution:
    def isNumber(self, s: str) -> bool:
        state=[
            {},
            {"blank":1,"sign":2,"digit":3,"dot":4},
            {"digit":3,"dot":4},
            {"digit":3,"dot":4,"e|E":6,"blank":9},
            {"digit":5},
            {"digit":5,"e|E":6,"blank":9},
            {"sign":7,"digit":8},
            {"digit":8},
            {"digit":8,"blank":9},
            {"blank":9},
        ]
        def charToAction(c: str) :
            if c==".":
                return "dot"
            if c>="0" and c<="9":
                return "digit"
            if c=="+" or c=="-":
                return "sign"
            if c=="e" or c=="E":
                return "e|E"
            if c==" ":
                return "blank"
            return None


        curState=1
        
        for c in s:
            action=charToAction(c)
            if action not in state[curState]:
                return False
            curState=state[curState][action]
        return curState in {3,5,8,9}

#测试数据
s="0"
#预期输出：True
solution=Solution()
print(solution.isNumber(s))

s="e"
#预期输出：False
solution=Solution()
print(solution.isNumber(s))

s="."
#预期输出：False
solution=Solution()
print(solution.isNumber(s))